﻿#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
//union Un1
//{
//	char c[5];
//	int i;
//};
//union Un2
//{
//	short c[7];
//	int i;
//};
//int main()
//{
//	//下⾯输出的结果是什么？
//	printf("%d\n", sizeof(union Un1));
//	printf("%d\n", sizeof(union Un2));
//	return 0;
//}

//struct gift_list
//{
//	//公共属性
//	int stock_number;//库存量
//	double price; //定价
//	int item_type;//商品类型
//
//	//特殊属性
//	char title[20];//书名
//	char author[20];//作者
//	int num_pages;//⻚数
//	char design[30];//设计
//	int colors;//颜⾊
//	int sizes;//尺⼨
//};

//struct gift_list
//{
//	int stock_number;//库存量
//	double price; //定价
//	int item_type;//商品类型
//	union {
//		struct
//		{
//			char title[20];//书名
//			char author[20];//作者
//			int num_pages;//⻚数
//		}book;
//		struct
//		{
//			char design[30];//设计
//		}mug;
//		struct
//		{
//			char design[30];//设计
//			int colors;//颜⾊
//			int sizes;//尺⼨
//		}shirt;
//	}item;
//};


//int check_sys()
//{
//	int i = 1;
//	return *(char*)&i;
//}

//int check_sys()
//{
//	union Un
//	{
//		char c;
//		int i;
//	u.i = 1;
//	return u.c;
//}
//
//int main()
//{
//	int ret = check_sys();
//	if (ret == 1)
//		printr("小端\n");
//	else
//		printf("大端\n");
//	return 0; 
//}

//enum Color
//{
//	//三原色的可能取值
//	RED,
//	GREEN,
//	BLUE
//};
//
//int main()
//{
//	enum Color color = RED;
//	return 0;\
//}

#include<stdlib.h>
//int main()
//{
//	//20个字节 - 想存入五个整型
//	int* p = malloc(20);
//	if (p == NULL)
//	{
//		perror("malloc");
//			return 1;
//	}
//	//使用空间
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		*(p + i) = i + 1;
//	}
//	//释放内存
//	free(p);
//	p = NULL;
//	return 0;
//}


//向内存申请5个整型的空间

//int main()
//{
//	//int* p = (int*)malloc(5 * sizeof(int));
//	//if (p == NULL)
//	//{
//	//	perror("malloc");
//	//	return 1;
//	//}
//
//	int* p = (int*)calloc(5,sizeof(int));
//	if (p == NULL)
//	{
//		perror("calloc");
//		return 1;
//	}
//
//	int i = 0;
//	for (i; i < 5; i++)
//	{
//		*(p + i) = i + 1;
//	}
//	//把空间调整成40个字节
//	//p = (int*)realloc(p, 40);
//	int* ptr = (int*)realloc(p, 40);
//	if (ptr == NULL)
//	{
//		p = ptr;
//	}
//	else
//	{
//		perror("realloc");
//		return 1;
//	}
//	return 0;
//
//}

//int main()
//{
//	realloc(NULL, 20);//===malloc(20)
//
//	return 0;
//}

//int main()
//{
//	int* p = (int*)malloc(INT_MAX);
//	*p = 20;
//}

//void test()
//{
//	int i = 0;
//	int* p = (int*)malloc(10 * sizeof(int));
//	if (NULL == p)
//	{
//		exit(EXIT_FAILURE);
//	}
//	for (i = 0; i <= 10; i++)
//	{
//		*(p + i) = i;//当i是10的时候越界访问
//	}
//	free(p);
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//void test()
//{
//int a = 10;
//int* p = &a;
//free(p);
//}

//int main()
//{
//	int* p = (int*)malloc(100);
//	if (p == NULL)
//	{
//		return 1;
//	}
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		*p = i + 1;
//		p++;
//	}
//	free(p);
//	p = NULL;
//
//	return 0;
//}

//test()
//{
//	int* p = (int*)malloc(20);
//	int n = 3;
//	if (n > 0)
//		return;
//	free(p);
//	p = NULL;
//
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//void GetMemory(char* p)
//{
//	p = (char*)malloc(100);
//}
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(str);
//	strcpy(str, "hello world");
//	printf(str);
//}
//int main()
//{ 
//	Test();
//	return 0;
//}

//void GetMemory(char** p)
//{
//	p = (char*)malloc(100);
//}
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(&str);
//	strcpy(str, "hello world");
//	printf(str);
//	free(str);
//	str = NULL;
//}
//int main()
//{
//	Test();
//	return 0;
//}

//char* GetMemory(char* p)
//{
//	p = (char*)malloc(100);
//	return p;
//}
//void Test(void)
//{
//	char* str = NULL;
//	str = GetMemory(str);
//	strcpy(str, "hello world");
//	printf(str);
//	free(str);
//	str = NULL;
//}
//int main()
//{
//	Test();
//	return 0;
//}

//char* GetMemory(void)
//{
//	char p[] = "hello world";
//	return p;
//}
//void Test(void)
//{
//	char* str = NULL;
//	str = GetMemory();
//	printf(str);
//}
//int main()
//{
//	Test();
//	return 0;
//}

//void GetMemory(char** p, int num)
//{
//	*p = (char*)malloc(num);
//}
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(&str, 100);
//	strcpy(str, "hello");
//	printf(str);
//}
//int main()
//{
//	Test();
//	return 0;
//}

//void Test(void)
//{
//	char* str = (char*)malloc(100);
//	strcpy(str, "hello");
//	free(str);
//	if (str != NULL)
//	{
//		strcpy(str, "world");
//		printf(str);
//	}
//}
//int main()
//{
//	Test();
//	return 0;
//}


//struct st_type
//{
//	int i;
//	int a[0];//柔性数组成员
//};
////有些编译器会报错⽆法编译可以改成：
//struct st_type
//{
//	int i;
//	int a[];//柔性数组成员
//};

//struct S
//{
//	int n;
//	int arr[];
//};
//int main()
//{
//	//开辟空间
//	struct S*ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
//	if (ps == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	//使用空间
//	ps->n = 100;
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		ps->arr[i] = i;
//	}
//	//调整空间
//	struct S* ptr = (struct S*)realloc(ps,sizeof(struct S) + 10 * sizeof(int));
//	if (ps != NULL)
//	{
//		ps = ptr;
//	}
//	//释放空间
//	free(ps);
//	ps = NULL;
//
//	return 0;
//}

struct S
{
	int n;
	int* arr;
};
int main()
{
	//开辟空间
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	if (ps == NULL)
		return 1;
	ps->arr = (int*)malloc(5 * sizeof(int));
	if (ps->arr == NULL)
		return 1;
	//使用空间
	ps->n = 100;
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	//调整大小
	int* ptr = realloc(ps->arr, 10 * sizeof(int));
	if (ptr != NULL)
	{
		ps = ptr;
	}
	//使用空间
	//…………
	//释放空间
	free(ps->arr);
	free(ps);
	return 0;
}